package com.bailian.member.dto.input;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;

@Data
@ApiModel(value = "用户信息实体类")
public class UserInpDTO {

    /**
     * userid
     */
    @ApiModelProperty(value = "用户id")
    private Long userId;
    /**
     * 手机号码
     */
    @ApiModelProperty(value = "手机号码")
    @NotBlank(message = "手机号码不能为空")
    @Pattern(regexp = "^((13[0-9])|(14[5-8])|(15([0-3]|[5-9]))|(16[6])|(17[0|4|6|7|8])|(18[0-9])|(19[8-9]))\\d{8}$", message = "手机号码格式不正确")
    private String mobile;
    /**
     * 邮箱
     */
    @ApiModelProperty(value = "邮箱")
    @NotBlank(message = "邮箱不能为空")
    @Email(message = "邮件格式不正确")
    private String email;
    /**
     * 密码
     */
    @ApiModelProperty(value = "密码")
    @NotBlank(message = "密码不能为空")
    private String password;
    /**
     * 用户名称
     */
    @ApiModelProperty(value = "用户名称")
    @NotBlank(message = "用户名称不能为空")
    private String userName;
    /**
     * 性别 1 男 2女
     */
    @ApiModelProperty(value = "用户性别")
    @NotBlank(message = "用户性别不能为空")
    @Pattern(regexp = "^[0-9]{1,2}$", message = "用户性别格式不正确")
    private String sex;
    /**
     * 年龄
     */
    @ApiModelProperty(value = "用户年龄")
    @NotBlank(message = "用户年龄不能为空")
    @Pattern(regexp = "^(?:[1-9][0-9]?|1[01][0-9]|120)$", message = "用户年龄不正确")
    private String age;

    /**
     * 用户头像
     */
    @ApiModelProperty(value = " 用户头像")
    private String picImg;
    /**
     * 用户关联 QQ 开放ID
     */
    @ApiModelProperty(value = "用户关联 QQ 开放ID")
    private String qqOpenId;
    /**
     * 用户关联 微信 开放ID
     */
    @ApiModelProperty(value = "用户关联 微信 开放ID")
    private String wxOpenId;

    // 目前存在的问题： 接口层传递实体类→数据库传递实体类 都是相同的。
    // 注册的时候不需要传递isAvalible updateTime createTime
    // 查询的用户相关信息的时候，是不需要将密码返回给客户端
    // 请求参数与返回参数如果公用同一个实体类会存在那些问题？ 可能会暴露数据库字段攻击 安全性
    // 修改用户密码

    // DTO 主要用于外部接口参数传递封装 接口与接口进行传递使用
    // DO主要操作用于数据库层传递
    // VO主要用于视图层展示
    // DTO转换DO (接口接受参数，转换为数据库实体类插入数据库中) DO转换DTO（向数据库查询数据转换DTO返回给客户端）

}
